package org.study.tdengine.api.util;

import com.taosdata.jdbc.TSDBDriver;

import java.sql.*;
import java.util.Properties;

/**
 * 参考 https://docs.taosdata.com/connector/java
 * <p>
 * 连接器建立连接的方式，TDengine 提供三种：
 * 1、通过客户端驱动程序 taosc 直接与服务端程序 taosd 建立连接，这种连接方式下文中简称 “原生连接”。
 * 2、通过 taosAdapter 组件提供的 REST API 建立与 taosd 的连接，这种连接方式下文中简称 “REST 连接”
 * 3、通过 taosAdapter 组件提供的 Websocket API 建立与 taosd 的连接，这种连接方式下文中简称 “Websocket 连接”
 * <p>
 * 无论使用何种方式建立连接，连接器都提供了相同或相似的 API 操作数据库，都可以执行 SQL 语句，只是初始化连接的方式稍有不同，用户在使用上不会感到什么差别。关键不同点在于：
 * 1、使用 原生连接，需要保证客户端的驱动程序 taosc 和服务端的 TDengine 版本配套。
 * 2、使用 REST 连接，用户无需安装客户端驱动程序 taosc，具有跨平台易用的优势，但是无法体验数据订阅和二进制数据类型等功能。另外与 原生连接 和 Websocket 连接相比，REST连接的性能最低。
 * 3、使用 Websocket 连接，用户也无需安装客户端驱动程序 taosc。
 * 4、连接云服务实例，必须使用 REST 连接 或 Websocket 连接。
 * 一般我们建议使用 Websocket 连接。
 *
 * @author doveylovey
 * @version v1.0.0
 * @email 1135782208@qq.com
 * @date 2023年04月26日
 */
public class TDengineConnection {
    /**
     * 原生连接：需要保证客户端的驱动程序 taosc 和服务端的 TDengine 版本配套
     */
    public static Connection getConn() throws SQLException {
        // System.load("C://TDengine//driver//taos.dll");
        // Class.forName("com.taosdata.jdbc.TSDBDriver");
        // 参数(如：user、password等)可以追加在url后面，也可以通过properties设置
        String jdbcUrl = "jdbc:TAOS://127.0.0.1:6030/test?user=root&password=taosdata";
        Properties properties = new Properties();
        properties.setProperty(TSDBDriver.PROPERTY_KEY_USER, "root");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_PASSWORD, "taosdata");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, "en_US.UTF-8");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "Asia/Shanghai");
        Connection conn = DriverManager.getConnection(jdbcUrl, properties);
        return conn;
    }

    /**
     * WebSocket连接
     */
    public static Connection getWsConn() throws SQLException {
        // Class.forName("com.taosdata.jdbc.ws.WebSocketDriver");
        // 参数(如：user、password等)可以追加在url后面，也可以通过properties设置
        String jdbcUrl = "jdbc:TAOS-WS://127.0.0.1:6041/test?user=root&password=taosdata";
        Properties properties = new Properties();
        properties.setProperty(TSDBDriver.PROPERTY_KEY_USER, "root");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_PASSWORD, "taosdata");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_BATCH_LOAD, "true");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "Asia/Shanghai");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT, "true");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_VARCHAR_AS_STRING, "true");
        // Connection conn1 = DriverManager.getConnection(jdbcUrl);
        Connection conn = DriverManager.getConnection(jdbcUrl, properties);
        return conn;
    }

    /**
     * REST连接
     */
    public static Connection getRestConn() throws SQLException {
        // Class.forName("com.taosdata.jdbc.rs.RestfulDriver");
        // 参数(如：user、password等)可以追加在url后面，也可以通过properties设置
        String jdbcUrl = "jdbc:TAOS-RS://127.0.0.1:6041/test?user=root&password=taosdata";
        Properties properties = new Properties();
        properties.setProperty(TSDBDriver.PROPERTY_KEY_USER, "root");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_PASSWORD, "taosdata");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_BATCH_LOAD, "true");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_CHARSET, "UTF-8");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, "Asia/Shanghai");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_ENABLE_AUTO_RECONNECT, "true");
        properties.setProperty(TSDBDriver.PROPERTY_KEY_VARCHAR_AS_STRING, "true");
        // Connection conn1 = DriverManager.getConnection(jdbcUrl);
        Connection conn = DriverManager.getConnection(jdbcUrl, properties);
        return conn;
    }
}
